﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TagCore
{
    public static class Genres
    {
        private static List<string> genres = new List<string>();

        static Genres()
        {
            genres.Add("Blues");
            genres.Add("Folk");
            genres.Add("Dance");
            genres.Add("New Age");
            genres.Add("Disco");
            genres.Add("Techno");
            genres.Add("Country");
            genres.Add("Funk");
            genres.Add("Hip-Hop");
            genres.Add("Jazz");
            genres.Add("Pop");
            genres.Add("R&B");
            genres.Add("Rap");
            genres.Add("Reggae");
            genres.Add("Rock");
            genres.Add("Alternative");
            genres.Add("Soundtrack");
            genres.Add("Ambient");
            genres.Add("Trip-Hop");
            genres.Add("Vocal");
            genres.Add("Trance");
            genres.Add("Classical");
            genres.Add("Instrumental");
            genres.Add("Acid");
            genres.Add("House");
            genres.Add("Sound Clip");
            genres.Add("Gospel");
            genres.Add("Soul");
            genres.Add("Punk");
            genres.Add("Electronic");
            genres.Add("Eurodance");
            genres.Add("Jungle");
            genres.Add("Rave");
            genres.Add("Tribal");
            genres.Add("Rock & Roll");
            genres.Add("Opera");
            genres.Add("Club");
            genres.Add("Indie");
            genres.Sort();
        }

        public static string[] Get()
        {
            return genres.ToArray();
        }

        public static string Match(string[] gs)
        {
            Dictionary<string, int> matches = new Dictionary<string, int>();
            GetMatches(gs, matches);
            return GetResult(matches);
        }

        private static void GetMatches(string[] gs, Dictionary<string, int> matches)
        {
            string[] all = Get();
            foreach (string g in gs)
            {
                string match = TagCoreUtil.MatchTitle(all, g);
                int count;
                if (matches.TryGetValue(match, out count))
                    matches[match]++;
                else
                    matches.Add(match, 1);
            }
        }

        private static string GetResult(Dictionary<string, int> matches)
        {
            string result = string.Empty;
            int max = 0;
            foreach (string key in matches.Keys)
            {
                if (matches[key] > max)
                {
                    result = key;
                    max = matches[key];
                }
            }

            return result;
        }
    }
}
